/*
 X星球居民小区的楼房全是一样的，并且按矩阵样式排列。其楼房的编号为1,2,3... 当排满一行时，
从下一行相邻的楼往反方向排号。
 比如：当小区排号宽度为6时，开始情形如下：   
1  2  3  4  5  6 
12 11 10 9  8  7 
13 14 15 .....   
我们的问题是：
已知了两个楼号m和n，需要求出它们之间的最短移动距离（不能斜线方向移动）  
输入为3个整数w m n，空格分开，都在1到10000范围内 w为排号宽度，m,n为待计算的楼号。
  要求输出一个整数，表示m n 两楼间最短移动距离。  
 例如： 
用户输入： 
6 8 2 
 则，程序应该输出： 
4  
 再例如：
用户输入： 
4 7 20  
则，程序应该输出：
 5   
资源约定：  
峰值内存消耗 < 256M 
CPU消耗  < 1000ms    
请严格按要求输出，不要画蛇添足地打印类似：“请您输入...” 的多余内容。   
所有代码放在同一个源文件中，调试通过后，拷贝提交该源码。   
注意: main函数需要返回0  注意: 只使用ANSI C/ANSI C++ 标准，不要调用依赖于编译环境或操作系统的特殊函数。 
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>， 不能通过工程设置而省略常用头文件。  
 */
package com.yuan.algorithms.competition;

import java.util.Scanner;

public class 第六届南桥杯_移动的最短路径 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext()) {
			int w = sc.nextInt();
			int m = sc.nextInt();
			int n = sc.nextInt();
			int x1, y1, x2, y2;
			y1 = m % w == 0 ? m / w - 1 : m / w;
			y2 = n % w == 0 ? n / w - 1 : n / w;
			if (m % w == 0) {
				if (m / w % 2 == 0) {
					x1 = m % w;
				} else {
					x1 = w - 1;
				}
			} else {
				if (m / w % 2 == 0) {
					x1 = m % w - 1;
				} else {
					x1 = w - m % w;
				}
			}
			
			if (n % w == 0) {
				if (n / w % 2 == 0) {
					x2 = n % w;
				} else {
					x2 = w - 1;
				}
			} else {
				if (n / w % 2 == 0) {
					x2 = n % w - 1;
				} else {
					x2 = w - n % w;
				}
			}

			System.out.println(Math.abs(x1 - x2) + Math.abs(y1 - y2));
			System.out.println(x1 + " " + y1 + " " + x2 + " " + y2);
		}

	}

}
